package com.wande.dataplatform.filecollection.service;

import com.wande.dataplatform.filecollection.domain.dto.FieldInfo;
import com.wande.dataplatform.filecollection.domain.dto.ParseResult;
import com.wande.dataplatform.filecollection.parser.IFileParser;
import com.wande.dataplatform.filecollection.parser.ParserConfig;

import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

/**
 * 文件解析服务接口
 * 提供文件解析的统一入口
 *
 * @author dataplatform
 * @date 2025-01-24
 */
public interface IFileParsingService {

    /**
     * 注册解析器
     *
     * @param fileType 文件类型
     * @param parser 解析器实例
     */
    void registerParser(String fileType, IFileParser parser);

    /**
     * 获取解析器
     *
     * @param fileType 文件类型
     * @return 解析器实例
     */
    IFileParser getParser(String fileType);

    /**
     * 检测文件字段
     *
     * @param inputStream 文件输入流
     * @param fileType 文件类型
     * @param config 解析器配置
     * @return 字段信息列表
     */
    List<FieldInfo> detectFields(InputStream inputStream, String fileType, ParserConfig config);

    /**
     * 解析文件
     *
     * @param inputStream 文件输入流
     * @param fileType 文件类型
     * @param config 解析器配置
     * @return 解析结果
     */
    ParseResult parseFile(InputStream inputStream, String fileType, ParserConfig config);

    /**
     * 流式解析文件
     *
     * @param inputStream 文件输入流
     * @param fileType 文件类型
     * @param config 解析器配置
     * @param consumer 数据消费者
     */
    void parseFileStream(InputStream inputStream, String fileType, ParserConfig config, 
                        Consumer<Map<String, Object>> consumer);

    /**
     * 验证文件格式
     *
     * @param inputStream 文件输入流
     * @param fileType 文件类型
     * @param config 解析器配置
     * @return 是否有效
     */
    boolean validateFile(InputStream inputStream, String fileType, ParserConfig config);

    /**
     * 获取支持的文件类型列表
     *
     * @return 文件类型列表
     */
    List<String> getSupportedFileTypes();
}
